package com.myreflect2GetConstructor;

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

public class MyReflectDemo2 {
    public static void main(String[] args) throws Exception {

        //1.获取class字节码文件对象
        Class clazz = Class.forName("com.myreflect2GetConstructor.Student");

        //2.获取构造方法
        //2.1获取所有非私有构造方法
        Constructor[] cons1 = clazz.getConstructors();
        for (Constructor constructor : cons1) {
            System.out.println(constructor);
        }
        System.out.println("-------------------------");
        //2.1获取所有构造方法
        Constructor[] cons2 = clazz.getDeclaredConstructors();
        for (Constructor declaredConstructor : cons2) {
            System.out.println(cons2);
        }
        System.out.println("-------------------------");
        //2.2获取单个构造方法

            Constructor con1 = clazz.getConstructor();
            System.out.println(con1);

        System.out.println("-------------------------");
        //获取带参构造方法
            Constructor con2 = clazz.getConstructor(int.class);
            System.out.println(con2);

        System.out.println("-------------------------");
        //获取带参私有构造方法
            Constructor con3 = clazz.getDeclaredConstructor(String.class, int.class);
            System.out.println(con3);

            System.out.println("获取构造方法权限修饰符");
            int modifiers = con3.getModifiers();
            System.out.println(modifiers);

            System.out.println("获取构造函数所有参数");
            Parameter[] parameters = con3.getParameters();
            for (Parameter parameter : parameters) {
                System.out.println(parameter);
            }
        //用私有构造方法创建对象创建对象
            //构造方法为私有，用下行方法可以临时改变权限
            con3.setAccessible(true);
            Student student = (Student) con3.newInstance("张三", 15);
            System.out.println(student);



    }
}
